/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package eksperementotr;

import org.tr.util.Language;
import org.tr.filters.IParseCallback;
import org.tr.filters.PoFilter;
import org.tr.filters.IFilter;
import org.tr.filters.FilterContext;
import org.tr.filters.AbstractFilter;
import org.tr.util.TMXReader;

import java.util.*;
import java.io.*;
import java.sql.*;

/**
 *
 * @author vasya
 */
public class Main {

    protected static FilterContext context = new FilterContext(new Language("en"), new Language("ru"), false);

    /*! Все данные из *.po*/
    protected static Map<String, String> data = new TreeMap<String, String>();

    /*! Памят переводов из *.po*/
    protected static Map<String, String> tmx = new TreeMap<String, String>();

    /*! Фильтр входного файла
     *
     * Разбивает данные файла на карту, ключи которой — исходные строки,
     * а значения — их переводы.
     */
    protected static AbstractFilter filter;

    protected static TMXReader tmxR = new TMXReader("utf8", new Language(new Locale("en")),
                                                    new Language(new Locale("ru")), false);

    /*! Соединение с БД.*/
    protected static Connection con;

    /*! Использую для отправки запросов БД.*/
    protected static Statement st;

    /*! Хранит результаты запросов БД.*/
    protected static ResultSet rs;
    /**
     * @param args аргументы командной строки
     */
    public static void main(String[] args) {
        // Соеденюсь с базой данных.
        try{
//            Driver d = new com.mysql.jdbc.Driver();
            Class.forName("com.mysql.jdbc.Driver");
            Properties properties=new Properties();
            properties.setProperty("user","et");
            properties.setProperty("password","et");
            properties.setProperty("useUnicode","true");
            properties.setProperty("characterEncoding","utf8");
            con = DriverManager.getConnection("jdbc:mysql://localhost/eksperimentoTradukanto", properties);
            con.setAutoCommit(false);
            st = con.createStatement();
            // Получу спиок всех файлов *.po
            File f = new File("./");
            FilenameFilter ff = new FileListFilter("po");
            File fl[] = f.listFiles(ff);

            // Добавлю строки из каждого файла в БД.
            // Обработанные файлы перемещаю в "./обработанные/"
            filter = new PoFilter();
            for(int i = 0; i < fl.length; ++i){
                System.out.println(" " + i + fl[i].getName());
//              System.out.println(fl[i].getName());
                // Получу память переводов из *.po
                data.clear();
                tmx.clear();
                filter.parseFile(new File(fl[i].toString()), new TreeMap<String, String>(), context, new IParseCallback() {
                    public void addEntry(String id, String source, String translation, boolean isFuzzy,
                            String comment, IFilter filter) {
                        String segTranslation = isFuzzy ? null : translation;
                        data.put(source, segTranslation);
                        if (translation != null) {
                            // Add systematically the TU as a legacy TMX
                            String tmxSource = isFuzzy ? "[" + filter.getFuzzyMark() + "] " + source : source;
                            addFileTMXEntry(tmxSource, translation);
                        }
                    }

                    public void addFileTMXEntry(String source, String translation) {
                        tmx.put(source, translation);
                    }
                });

                // Добавлю память переводов из *.po в бд.
                Iterator e = tmx.keySet().iterator();
                while(e.hasNext()){
                    String enStr = (String)e.next();
                    System.out.println("     " + enStr);
                    System.out.println("     " + tmx.get(enStr));

                    // Внесу записи в бд.
                    skribiBD(enStr, tmx.get(enStr));

                }

                fl[i].renameTo(new File("./обработанные/" + fl[i].getName()));
            }

            // Получу спиок всех файлов *.tmx
            f = new File("./");
            ff = new FileListFilter("tmx");
            fl = f.listFiles(ff);
            
            // Добавлю строки из каждого файла в БД.
            // Обработанные файлы перемещаю в "./обработанные/"
            for(int i = 0; i < fl.length; ++i){
                System.out.println(fl[i].toString());
                tmxR.loadFile(fl[i].toString(), false);
                for(int j = 0; j < tmxR.numSegments(); ++j){
                    System.out.println("     " + tmxR.getSourceSegment(j));
                    System.out.println("     " + tmxR.getTargetSegment(j));
                    // Внесу записи в бд.
                    skribiBD(tmxR.getSourceSegment(j), tmxR.getTargetSegment(j));
                }

                fl[i].renameTo(new File("./обработанные/" + fl[i].getName()));
            }
        }catch(Exception e){
            System.out.println("Ошибка подключение к бд: " + e.toString());
        }
    }
    
    /** Записывает строки в БД — память переводов.
     * 
     * @param s исходная строка
     * @param t строка перевода
     */
    private static void skribiBD(final String s, final String t) {
        try{
            // Начало транзакции.
            PreparedStatement ps = con.prepareStatement("insert into eksperimentoTradukanto.enstr values(0,?)");
            ps.setString(1, s);
            ps.executeUpdate();
            ps.close();
            
            ps = con.prepareStatement("insert into eksperimentoTradukanto.rustr values(0,?)");
            ps.setString(1, t);
            ps.executeUpdate();
            ps.close();
            
            ps = con.prepareStatement("insert into eksperimentoTradukanto.konformaEnRu values(0,?,?)");
            
            rs = st.executeQuery("SELECT MAX(id) FROM enstr");
            rs.next();
            ps.setInt(1, rs.getInt(1));
            rs = st.executeQuery("SELECT MAX(id) FROM rustr");
            rs.next();
            ps.setInt(2, rs.getInt(1));
            ps.executeUpdate();
            ps.close();
            rs.close();
            con.commit(); // Завершение транзакции.
        }catch(SQLException ex){
            System.out.println("Транзакция не удалась: " + ex.toString());
            try{
                con.rollback(); // Отменю при неудаче
            }catch(SQLException e){
                System.out.println("Не удалось отменить транзакцию: " + e.toString());
            }
        }finally{
            //                        con.setAutoCommit(true);
        }
    }
}

